// See http://iphonedevwiki.net/index.php/Logos

//#import <UIKit/UIKit.h>
//
//@interface ViewController : UIViewController
//
//+(void)CZ_classMethod;
//
//@end
//
//%group group1
//%hook ViewController
//- (void)loginBtnAction:(id)sender{
//    %log;
//    %orig;
//    NSLog(@"成功！！！第一组");
//}
//
//
//%new
//-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//    NSLog(@"点击了屏幕");
//    //调用类方法
//    [%c(ViewController) CZ_classMethod];
////    [self.class CZ_classMethod];
//}
//
//%new
//+(void)CZ_classMethod{
//    NSLog(@"这是一个类方法");
//}
//
//
//
//%end
//%end
//
//%group group2
//%hook ViewController
//- (void)loginBtnAction:(id)sender{
//    NSLog(@"成功！！！第二组");
//}
//%end
//%end
//
//
//// 构造函数 - 初始化
//%ctor{
//    // 一般根据判断条件加载某一组
//    NSString *v = [UIDevice currentDevice].systemVersion;
//
//    if(v.doubleValue > 11.0){
//        %init(group1)
//    }
//    else{
//        %init(group2)
//    }
//}


#define HKDefaults [NSUserDefaults standardUserDefaults]
#define HKSWITCHKEY @"HKSWITCHKEY"
#define HKTIMEKEY @"HKTIMEKEY"

//关于界面
@interface MMTableViewInfo
- (long long)numberOfSectionsInTableView:(id)arg1;
@end
@interface NewSettingViewController:UIViewController
@end



%hook MMTableViewInfo
%new
- (void)textFieldDidChangeValue:(NSNotification *)notification{
    
    UITextField *sender = (UITextField *)[notification object];
    [HKDefaults setValue:sender.text forKey:HKTIMEKEY];
    [HKDefaults synchronize];
}

%new
-(void)switchChang:(UISwitch *)switchView{
    [HKDefaults setBool:switchView.isOn forKey:HKSWITCHKEY];
    [HKDefaults synchronize];
    [MSHookIvar <UITableView *>(self,"_tableView") reloadData];
}


- (void)scrollViewWillBeginDragging:(id)arg1{
    %orig;
    [MSHookIvar <UITableView *>(self,"_tableView") endEditing:YES];
}

//返回高度
- (double)tableView:
(UITableView *)tableView heightForRowAtIndexPath:(id)indexPath{
    //定位设置界面,并且是最后一组
    if([tableView.nextResponder.nextResponder isKindOfClass:%c(NewSettingViewController)]
       && [indexPath section] ==[self numberOfSectionsInTableView:tableView]-1){
        return 44;
        
    }else{
        return %orig;
    }
}


//每一个Cell
- (id)tableView:(UITableView *)tableView cellForRowAtIndexPath:(id)indexPath{
    //定位设置界面,并且是最后一组
    if([tableView.nextResponder.nextResponder isKindOfClass:%c(NewSettingViewController)]
       && [indexPath section] ==[self numberOfSectionsInTableView:tableView]-1){
        
        UITableViewCell * cell = nil;
        if([indexPath row] == 0){
            static NSString * swCell = @"SWCELL";
            cell = [tableView dequeueReusableCellWithIdentifier:swCell];
            if(!cell){
                cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:nil];
            }
            cell.textLabel.text = @"自动抢红包";
            //抢红包开关!!
            UISwitch * switchView = [[UISwitch alloc] init];
            switchView.on = [HKDefaults boolForKey:HKSWITCHKEY];
            [switchView addTarget:self action:@selector(switchChang:) forControlEvents:(UIControlEventValueChanged)];
            cell.accessoryView = switchView;
            cell.imageView.image = [UIImage imageNamed:([HKDefaults boolForKey:HKSWITCHKEY] == 1) ? @"unlocked" : @"locked"];
        }else if([indexPath row] == 1){
            static NSString * waitCell = @"waitCell";
            cell = [tableView dequeueReusableCellWithIdentifier:waitCell];
            if(!cell){
                cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:nil];
            }
            cell.textLabel.text = @"等待时间(秒)";
            UITextField * textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 150, 40)];
            //监听键盘输入
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChangeValue:) name:UITextFieldTextDidChangeNotification object:textField];
            textField.text = [HKDefaults valueForKey:HKTIMEKEY];
            textField.borderStyle = UITextBorderStyleRoundedRect;
            cell.accessoryView = textField;
            cell.imageView.image = [UIImage imageNamed:@"clock"];
        }
        cell.backgroundColor = [UIColor whiteColor];
        return cell;
        
    }else{
        return %orig;
    }
}

//每组多少行
- (long long)tableView:(UITableView *)tableView numberOfRowsInSection:(long long)section{
    //定位设置界面,并且是最后一个
    if([tableView.nextResponder.nextResponder isKindOfClass:%c(NewSettingViewController)]
       && section ==[self numberOfSectionsInTableView:tableView]-1){
        return 2;
        
    }else{
        return %orig;
    }
}

//多少组
- (long long)numberOfSectionsInTableView:(id)arg1{
    UITableView * tableView = MSHookIvar <UITableView *>(self,"_tableView");
    if([tableView.nextResponder.nextResponder isKindOfClass:%c(NewSettingViewController)]){//定位设置界面
        //在原来基础上多搞一组
        return %orig+1;
        
    }else{
        return %orig;
    }
}
%end

%hook NewSettingViewController
%new
-(void)keyboardWillShow:(NSNotification*)note{
    
    UIView * view = self.view;
    CGRect keyBoardRect=[note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    view.frame = CGRectMake(0, -keyBoardRect.size.height, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height );
    
}

%new
-(void)keyboardWillHide:(NSNotification*)note{
    UIView * view = self.view;
    view.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
    
}

- (void)viewDidLoad{
    %orig;
    //监听textField弹出和消失
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}



%end



/* Logos 语法
 1.Logos 使用
 1.1 拿到 LogosDemo.app,实现简单的代码
 1.2 hook LogosDemo.app的登录按钮
    %hook ViewController
    - (void)loginBtnAction:(id)sender{
        NSLog(@"成功！！！");
    }
    %end
 
 2.Logos 语法
 2.1 Logos 语法简介
 2.2 logos 语法分三大类
 2.3 logos 代码在文件中的位置
    .x 说明源文件支持Logos和C语法
    .xm 说明源文件支持Logos和 c/c++语法
 2.4 group
    1.方便管理logos代码
    2.不通的系统版本下的兼容管理
    3.grpup需要在构造函数中初始化,只要分组了之后每一组都需要初始化
    4.根据判断条件加载某一组
    5.所有没有分组的代码都在默认的组中
 2.5 %log 输出函数的调用栈
 2.6 %orig 调用原来的方法,可以写入参数，也可以接收返回值
 2.7 %new 添加方法（添加实例方法，添加类方法）
 2.8 %c
 
 3. FLEX 库
  3.1 主要使用在越狱环境中，非越狱环境不是太稳定
  3.2 https://github.com/Flipboard/FLEX
  3.3 集成到自己的应用中
     1.通过pod集成
     2.在当前项目目录下 pod init
     3.编辑podfile文件，删除不带 Dylib 的target分支，添加pod ‘FLEX’
     4.在 项目中 *Dylib.m 文件中添加 [[FLEXManager sharedManager] showExplorer]; 显示
 4. FLEX 界面分析
    4.1 选择控件修改颜色、字体、视图等。
    4.2 可以看到当前项目的视图层级结构
    4.3 网络等其它功能的调试
 5. 界面分析注入点 （这里以微信APP作为案例）如在微信的设置模块添加一个Section
    5.1 由于微信中多数的界面由TableView构成，所以我们这里直接修改我们关心的代理方法或者其它数据，将需要Hook的方法复制出来
    5.2 NSHookIvar() hook成员变量、私有变量
    5.3 找到当前的控制器，遍历是否是我们需要的控制器
 6. 添加代码，demo中
*/
